---- 常用函数最好局部变量化，可以加快访问速度
--local GetTime = GetTime
--local tremove = tremove
--local tinsert = tinsert
--local floor = floor
--local tonumber = tonumber
--local strtrim = strtrim
--local GetUnitName = GetUnitName
--
--local TARGET_TOKEN_NOT_FOUND = TARGET_TOKEN_NOT_FOUND
--
---- 事件监听用对象
--local frm = CreateFrame("Frame")
--
---- 隐藏frm后，OnUpdate 事件不会被触发，避免额外的CPU消耗
--frm:Hide()
--
---- 任务列表
--local taskList = {}
--
---- 任务有无标识
--local hasTask = false
--
---- 可重复使用的任务缓存表
---- 实际上同时运行的/in命令很少，每次创建一个新的table会造成额外的浪费
---- 所以复用每个table可以提升性能
--local cache = {}
--
---- 新建任务
--local function newTask(delay, command)
--    -- 优先使用缓存表，没有备用再创建新表
--    local task = tremove(cache) or {}
--
--    -- 替换 %t -> 目标名字
--    if command:find("%%t") then
--        command = command:gsub("%%t", GetUnitName("target") or TARGET_TOKEN_NOT_FOUND)
--    end
--
--    -- 替换 %f -> 焦点名字
--    if command:find("%%f") then
--        command = command:gsub("%%f", GetUnitName("focus") or TARGET_TOKEN_NOT_FOUND)
--    end
--
--    -- 补充 /
--    if command:sub(1, 1) ~= "/" then
--        command = "/" .. command
--    end
--
--    -- 因为以0.1秒为最小单位，所以乘10倍整数化利于后续处理
--    task.Time = floor((GetTime() + delay) * 10)
--    task.Command = command
--
--    -- 添加任务进入任务列表
--    taskList[task] = true
--
--    if not hasTask then
--        -- 调整标记，并显示frm，开始监听OnUpdate事件
--        hasTask = true
--        frm:Show()
--    end
--end
--
---- 销毁任务
--local function disposeTask(task)
--    -- 移除任务
--    taskList[task] = nil
--
--    -- 放入缓存表备用
--    tinsert(cache, task)
--
--    -- 如果没有额外任务，调整标记，并隐藏frm，停止监听OnUpdate事件
--    if not next(taskList) then
--        hasTask = false
--        frm:Hide()
--    end
--end
--
---- 运行后续命令，调用了WOW自带插件的函数，现在不用太在意如何实现
--local function runTask(task)
--    local command = task.Command
--
--    -- 销毁任务
--    disposeTask(task)
--
--    -- 运行命令
--    if not command then
--        return
--    end
--
--    ChatFrame10.editBox:SetText(command)
--    ChatEdit_SendText(ChatFrame10.editBox)
--    ChatFrame10.editBox:SetText("")
--end
--
---- 每0.1秒扫描任务表，所以用lastScan记录上次扫描时间*10 的整数值
--local lastScan = 0
--
--frm:SetScript("OnUpdate", function(self, elapsed)
--    local nowScan = floor(GetTime() * 10)
--
--    -- 因为一般情况下，两次OnUpdate间隔仅0.01-0.06左右，不满0.1秒
--    -- 减少扫描次数来提高性能
--    if lastScan == nowScan then
--        return
--    end
--
--    -- 记录新时间
--    lastScan = nowScan
--
--    -- 扫描任务列表并执行
--    for task in pairs(taskList) do
--        if nowScan >= task.Time then
--            -- 使用pcall确保不会因为错误中断扫描
--            local ok, ret = pcall(runTask, task)
--
--            -- 如果有错，交给其他错误程序处理
--            if not ok then
--                geterrorhandler()(ret)
--            end
--        end
--    end
--end)
--
---- 注册命令行
--SLASH_CMDIN1 = "/in"
--
---- 处理命令
--SlashCmdList.CMDIN = function(msg, input)
--    if type(msg) == "string" then
--        -- 分拆形如 '40.0 /raid 嗜血结束' -> '40.0', '/raid 嗜血结束'
--        local delay, command = msg:match("([%d.]+)%s*(.+)")
--
--        delay = tonumber(delay)
--        command = strtrim(command or "")
--
--        -- 检查输入，生成新的任务
--        if delay and delay >= 0.1 and command ~= "" then
--            return newTask(delay, command)
--        end
--    end
--end